package ar.com.sne.model.web.controller.sys;

/**
 * Usuario Controller.
 * 
 * @author Pepe Pompin
 */

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.apache.log4j.Logger;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Listbox;

import ar.com.sne.model.bo.sys.SysTipoUsuario;
import ar.com.sne.model.bo.sys.SysUsuario;
import ar.com.sne.model.dao.factory.SysDAOFactory;
import ar.com.sne.util.SNeHibernateUtil;

public class UsuarioController extends GenericForwardComposer {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	static private Logger log = Logger.getLogger(UsuarioController.class);

	private List<SysTipoUsuario> listTipos = new LinkedList<SysTipoUsuario>();
	SysUsuario currentUsuario = new SysUsuario();
	SysTipoUsuario tipoUsuario = new SysTipoUsuario();
	Listbox boxUsuario;
	Combobox comboTipoUsuario;
	
	public SysUsuario getCurrent() {
		return currentUsuario;
	}

	public void setCurrent(SysUsuario current) {
		this.currentUsuario = current;
	}

	public SysTipoUsuario getTipoUsuario() {
		return tipoUsuario;
	}

	public void setTipoUsuario(SysTipoUsuario tipoUsuario) {
		this.tipoUsuario = tipoUsuario;
	}

	public List<SysUsuario> getAllUsuarios() {
		return (List<SysUsuario>) SysUsuario.getList();
	}

	public void onClick$add_usuario() {
		// Inserta el registro del Usuario en la Base Datos.
		SNeHibernateUtil.currentSession().getTransaction().begin();
		
		SysUsuario newUsuario = new SysUsuario();

		newUsuario.setNombre(currentUsuario.getNombre());
		newUsuario.setPassword(currentUsuario.getPassword());
		newUsuario.setSysTipoUsuarios((SysTipoUsuario) comboTipoUsuario.getSelectedItem().getValue());

		SysDAOFactory.getSysUsuarioDAO().save(newUsuario);
		SNeHibernateUtil.currentSession().getTransaction().commit();

	}

	public void onClick$update_usuario() {
		if (boxUsuario.getSelectedItem() != null) {
			SNeHibernateUtil.currentSession().getTransaction().begin();
			
			SysTipoUsuario tipoUsuarioTemp = (SysTipoUsuario) comboTipoUsuario.getSelectedItem().getValue();

			log.info("Datos: " + tipoUsuarioTemp);
			log.info("Id: " + tipoUsuarioTemp.getId());
			log.info("Nombre: " + tipoUsuarioTemp.getNombre());
			log.info("Fecha: " + tipoUsuarioTemp.getFechaMod());
			
			
			currentUsuario.setSysTipoUsuarios(tipoUsuarioTemp);
			
			SysDAOFactory.getSysUsuarioDAO().update((SysUsuario) currentUsuario);
			SNeHibernateUtil.currentSession().getTransaction().commit();
		}
	}

	
	public void onClick$delete_usuario() {
		if (boxUsuario.getSelectedItem() != null) {
			SNeHibernateUtil.currentSession().getTransaction().begin();
			SysDAOFactory.getSysUsuarioDAO().delete((SysUsuario) currentUsuario);
			SNeHibernateUtil.currentSession().getTransaction().commit();
		}
	}
	
	public void onClick$boxUsuario() {
		if (boxUsuario.getSelectedItem() != null) {	
			comboTipoUsuario.setSelectedIndex(currentUsuario.getSysTipoUsuarios().getId().intValue() -1 );
		}
	}
	public static List<SysUsuario> getFilterUsuarios(String filter1) {
		List<SysUsuario> someUsuarios = new LinkedList<SysUsuario>();
		boolean filtro1OK;
		for (Iterator<SysUsuario> i = SysUsuario.getList().iterator(); i.hasNext();) {
			filtro1OK = false;
			SysUsuario tmp = i.next();
			if (!filter1.equals("") && filter1 !=null) {
				if (tmp.getNombre().toLowerCase().indexOf(filter1.trim().toLowerCase()) >= 0) {
					filtro1OK = true;
				}
			} 

			if (filtro1OK) {
				someUsuarios.add(tmp);
			}
		}
		return someUsuarios;
	}
	
	@SuppressWarnings("unchecked")
	public List<SysTipoUsuario> getListTipos() {
		this.listTipos = (List<SysTipoUsuario>) SysDAOFactory.getSysTipoUsuarioDAO().getList();
		log.debug("Cantidad Tipos Usuarios en lista: " + listTipos.size());
		return listTipos;
	}

}
